API: add gdk_cairo_get_clip_rectangle() convenience API
authorBenjamin Otte <otte@redhat.com>
Wed, 8 Sep 2010 23:45:54 +0000 (01:45 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 26 Sep 2010 13:11:34 +0000 (15:11 +0200)
docs/reference/gdk/gdk3-sections.txt
gdk/gdk.symbols
gdk/gdkcairo.c
gdk/gdkcairo.h

index 0b57d322506ddef5ad005deb602a4da21fdf1e5e..d03fa857d0d5b22705d4ffba22ce36fe1faa2251 100644 (file)
@@ -594,6 +594,7 @@ gdk_pango_context_get_for_screen
 <FILE>cairo_interaction</FILE>
 gdk_window_create_similar_surface
 gdk_cairo_create
+gdk_cairo_get_clip_rectangle
 gdk_cairo_set_source_color
 gdk_cairo_set_source_pixbuf
 gdk_cairo_set_source_window
index a5ec76ed13a1d0940842a0b987b67f57a0b8a36d..cc9dbcf11978b8f6dbffe80af5180aa96c76d22f 100644 (file)
@@ -288,6 +288,7 @@ gdk_visual_type_get_type G_GNUC_CONST
 #if IN_FILE(__GDK_CAIRO_C__)
 gdk_cairo_create
 gdk_cairo_reset_clip
+gdk_cairo_get_clip_rectangle
 gdk_cairo_set_source_color
 gdk_cairo_set_source_pixbuf
 gdk_cairo_set_source_window
index 7a7fc839cfc4057caa6b7dda55e9bcf533eea207..3ef1ce2b346a832541ef7e92a1d22e799fb373de 100644 (file)
@@ -89,6 +89,45 @@ gdk_cairo_reset_clip (cairo_t            *cr,
     GDK_DRAWABLE_GET_CLASS (drawable)->set_cairo_clip (drawable, cr);
 }
 
+/**
+ * gdk_cairo_get_clip_rectangle:
+ * @cr: a cairo context
+ * @rect: (out) (allow-none): return location for the clip, or %NULL
+ *
+ * This is a convenience function around cairo_clip_extents(). It rounds
+ * the clip extents to integer coordinates and returns a boolean
+ * indicating if a clip area exists.
+ *
+ * Returns: %TRUE if a clip rectangle exists, %FALSE if all of @cr is
+ * clipped and all drawing can be skipped.
+ **/
+gboolean
+gdk_cairo_get_clip_rectangle (cairo_t      *cr,
+                              GdkRectangle *rect)
+{
+  double x1, y1, x2, y2;
+  gboolean clip_exists;
+
+  cairo_clip_extents (cr, &x1, &y1, &x2, &y2);
+
+  clip_exists = x1 < x2 && y1 < y2;
+
+  if (rect)
+    {
+      x1 = floor (x1);
+      y1 = floor (y1);
+      x2 = ceil (x2);
+      y2 = ceil (y2);
+
+      rect->x      = CLAMP (x1,      G_MININT, G_MAXINT);
+      rect->y      = CLAMP (y1,      G_MININT, G_MAXINT);
+      rect->width  = CLAMP (x2 - x1, G_MININT, G_MAXINT);
+      rect->height = CLAMP (y2 - y1, G_MININT, G_MAXINT);
+    }
+
+  return clip_exists;
+}
+
 /**
  * gdk_cairo_set_source_color:
  * @cr: a #cairo_t
index 99afc064f8eaf58c9c2a0c8f2963ab0b27e04fc1..6da20007c4f1b293305f336b06214b163c8a469a 100644 (file)
@@ -33,6 +33,8 @@ G_BEGIN_DECLS
 cairo_t *gdk_cairo_create            (GdkDrawable        *drawable);
 void     gdk_cairo_reset_clip        (cairo_t            *cr,
                                      GdkDrawable        *drawable);
+gboolean gdk_cairo_get_clip_rectangle(cairo_t            *cr,
+                                      GdkRectangle       *rect);
 
 void     gdk_cairo_set_source_color  (cairo_t            *cr,
                                       const GdkColor     *color);